/**
 * 视图组件基类 - 最小化的核心实现
 * 
 * 职责：
 * 1. 存储 Cocos Creator 节点引用
 * 2. 管理节点的基本生命周期
 * 3. 提供基础的可见性控制
 * 
 * 设计理念：
 * - 只包含所有视图组件都需要的核心功能
 * - 零组件缓存（完全由子类决定）
 * - 最小内存占用
 * 
 * @author AI Assistant
 * @date 2025-11-29
 */

import { ecs } from "../../../../core/ecs/ECS";
import { Node } from "cc";

/**
 * 视图组件基类
 * 
 * 内存占用：~40 bytes
 * - node: 8 bytes
 * - isReady: 1 byte
 * - isVisible: 1 byte
 * - layerName: ~24 bytes (字符串)
 * - 对象开销: ~8 bytes
 */
@ecs.register('ViewBase', false)
export class ViewComponentBase extends ecs.Comp {
    // ========== 核心引用 ==========
    
    /** 根节点引用 */
    public node: Node | null = null;
    
    // ========== 状态标记 ==========
    
    /** 是否已准备好 */
    public isReady: boolean = false;
    
    /** 是否可见 */
    public isVisible: boolean = true;
    
    /** 层级名称（用于调试） */
    public layerName: string = '';
    
    /**
     * 重置组件
     */
    reset(): void {
        this.node = null;
        this.isReady = false;
        this.isVisible = true;
        this.layerName = '';
    }
    
    /**
     * 初始化视图组件
     * @param node Cocos Creator 节点
     */
    init(node: Node): void {
        if (!node || !node.isValid) {
            console.error('[ViewComponentBase] 无效的节点');
            return;
        }
        
        this.node = node;
        this.isReady = true;
        this.isVisible = node.active;
    }
    
    /**
     * 设置可见性
     * @param visible 是否可见
     */
    setVisible(visible: boolean): void {
        if (!this.node || !this.node.isValid) return;
        
        this.node.active = visible;
        this.isVisible = visible;
    }
    
    /**
     * 切换可见性
     */
    toggleVisible(): void {
        this.setVisible(!this.isVisible);
    }
    
    /**
     * 检查节点是否有效
     */
    isValid(): boolean {
        return this.node !== null && this.node.isValid;
    }
    
    /**
     * 获取节点名称（用于调试）
     */
    getNodeName(): string {
        return this.node ? this.node.name : '<无节点>';
    }
    
    /**
     * 获取节点路径（用于调试）
     */
    getNodePath(): string {
        if (!this.node) return '<无节点>';
        
        let path = this.node.name;
        let parent = this.node.parent;
        
        while (parent) {
            path = `${parent.name}/${path}`;
            parent = parent.parent;
        }
        
        return path;
    }
    
    /**
     * 销毁节点
     * @param immediate 是否立即销毁（默认 false）
     */
    destroyNode(immediate: boolean = false): void {
        if (!this.node || !this.node.isValid) return;
        
        const nodeName = this.node.name;
        
        if (immediate) {
            this.node.destroyAllChildren();
            this.node.destroy();
        } else {
            this.node.destroy();
        }
        
        console.log(`[ViewComponentBase] 销毁节点: ${nodeName}`);
        
        this.reset();
    }
}

